﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Windows.Forms;

using Urgencias.Modelo;

namespace Urgencias.Controlador
{
    class MedicoControlador
    {
        private static MedicoControlador instance;
        Medico m;

        public MedicoControlador()
        {
            m = new Medico();
        }

        public static MedicoControlador Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new MedicoControlador();
                }

                return instance;
            }
        }

        public bool ingresarMedico(string RUN, string ESPECIALIDAD_MEDICA, string NOMBRE, string APELLIDOPATERNO, string APELLIDOMATERNO, DateTime FECHANACIMIENTO,char SEXO, bool DISPONIBILIDAD_FUNCIONARIO)
        {
            /*string RUN, ESPECIALIDAD_MEDICA, NOMBRE, APELLIDOPATERNO, APELLIDOMATERNO, DISPONIBILIDAD_FUNCIONARIO;
            char SEXO;
            DateTime FECHANACIMIENTO;*/

            if (FuncionarioControlador.Instance.ingresarFuncionario(RUN, ESPECIALIDAD_MEDICA, NOMBRE, APELLIDOPATERNO, APELLIDOMATERNO, FECHANACIMIENTO, SEXO, DISPONIBILIDAD_FUNCIONARIO))
                try
                {
                    SqlCommand com = new SqlCommand();


                    com.CommandText = "INSERT INTO MEDICO" +
                        "(RUN,  ESPECIALIDAD_MEDICO, NOMBRE, APELLIDOPATERNO, APELLIDOMATERNO,FECHANACIMIENTO,SEXO, DISPONIBILIDAD_FUNCIONARIO)" + "VALUES" +
                        "(@run, @especialidad_medica, @nombre, @apellidopaterno, @apellidomaterno, @fechanacimiento, @sexo, @disponibilidad_funcionario)";

                    com.Parameters.AddWithValue("@run", RUN);
                    com.Parameters.AddWithValue("@especialidad_medica", ESPECIALIDAD_MEDICA);
                    com.Parameters.AddWithValue("@nombre", NOMBRE);
                    com.Parameters.AddWithValue("@apellidopaterno", APELLIDOPATERNO);
                    com.Parameters.AddWithValue("@apellidomaterno", APELLIDOMATERNO);
                    com.Parameters.AddWithValue("@sexo", SEXO);
                    com.Parameters.AddWithValue("@fechanacimiento", FECHANACIMIENTO);
                    com.Parameters.AddWithValue("@disponibilidad_funcionario", DISPONIBILIDAD_FUNCIONARIO);

                    com.Connection = Conexion.Instance.Con;
                    SqlDataReader ejecutar = com.ExecuteReader();
                    Conexion.Instance.Con.Close();
                    return true;
                }
                catch (Exception e)
                {
                    Conexion.Instance.Con.Close();
                    Console.WriteLine(e.Message);
                    return false;
                    throw;
                }
            else
                return false;
        }

        public bool modificarMedico(string rut)
        {
            return modificarMedico(m.Run,m.EspecialidadMedico, m.Nombre, m.ApellidoPaterno,m.ApellidoMaterno,m.FechaNacimiento,m.Sexo,m.Disponible);
        }

        public bool modificarMedico(string Run, string EspecialidadMedico, string Nombre, string ApellidoPaterno, string ApellidoMaterno, DateTime FechaNacimiento, char Sexo, bool Disponible)
        {
            try
            {
                SqlCommand com = new SqlCommand();
                

                com.CommandText = "UPDATE MEDICO " +
                    "SET NOMBRE = @nombre, ESPECIALIDAD_MEDICA = @especialidad_medica, APELLIDOPATERNO = @apellidopaterno, APELLIDOMATERNO = @apellidomaterno, FECHANACIMIENTO = @fechanacimiento, SEXO = @sexo, DISPONIBILIDAD_FUNCIONARIO=@disponibilidad_funcionario " +
                    "WHERE RUN = @run";
                /*com.CommandText = "INSERT INTO MEDICO" +
                    "(RUN,  ESPECIALIDAD_MEDICA, NOMBRE, APELLIDOPATERNO, APELLIDOMATERNO,FECHANACIMIENTO,SEXO, DISPONIBILIDAD_FUNCIONARIO)" + "VALUES" +
                    "(@run, @especialidad_medica, @nombre, @apellidopaterno, @apellidomaterno, @fechanacimiento, @sexo, @disponibilidad_funcionario)";
                */


                com.Parameters.AddWithValue("@run", Run);
                com.Parameters.AddWithValue("@nombre", m.Nombre);
                com.Parameters.AddWithValue("@apellidopaterno", m.ApellidoPaterno);
                com.Parameters.AddWithValue("@apellidomaterno", m.ApellidoMaterno);
                com.Parameters.AddWithValue("@sexo", m.Sexo);
                com.Parameters.AddWithValue("@fechaNacimiento", m.FechaNacimiento);
                //com.Parameters.AddWithValue("@telefono", m.Telefono);
                //com.Parameters.AddWithValue("@direccion", m.Direccion);
                com.Parameters.AddWithValue("@especialidad", m.EspecialidadMedico);

                com.Connection = Conexion.Instance.Con;
                SqlDataReader ejecutar = com.ExecuteReader();
                // TODO terminar esto

                Conexion.Instance.Con.Close();

                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Conexion.Instance.Con.Close();
                return false;
                throw;
            }
        }

        public bool eliminarMedico(string rut)
        {
            bool resultado = false;
            try
            {
                
                SqlCommand com = new SqlCommand("DELETE FROM MEDICO WHERE RUN = '" + rut + "')");
                SqlDataReader ejecutar = com.ExecuteReader();
                if (ejecutar.Read())
                {
                    resultado = true;
                }
                Conexion.Instance.Con.Close();
                return resultado;
            }
            catch (Exception)
            {
                Conexion.Instance.Con.Close();
                return resultado;
                throw;
            }
        } 

        public Medico buscarMedico(string rut)
        {
            Medico m = new Medico();

            try
            {
                SqlCommand com = new SqlCommand();
                

                com.CommandText = "select * from MEDICO where Rut='" + rut + "'";
                com.Connection = Conexion.Instance.Con;

                SqlDataReader ejecuta = com.ExecuteReader();

                if (ejecuta.Read() == true)
                {
                    m.Run = (string)(ejecuta["RUN"]);
                    m.Nombre = ((string)(ejecuta["NOMBRE"])).Trim();
                    m.ApellidoMaterno = ((string)(ejecuta["APELLIDOMATERNO"])).Trim();
                    m.ApellidoPaterno = ((string)(ejecuta["APELLIDOPATERNO"])).Trim();
                    string v = ((string)(ejecuta["SEXO"])).Trim();
                    m.Sexo = v[0];
                    m.FechaNacimiento = (DateTime)(ejecuta["FECHANACIMIENTO"]);
                    //m.Telefono = ((string)(ejecuta["Telefono"])).Trim();
                    //m.Direccion = ((string)(ejecuta["Direccion"])).Trim();
                    m.EspecialidadMedico = ((string)(ejecuta["ESPECIALIDAD_MEDICO"])).Trim();

                }
                else
                {
                    m = null;
                }
                Conexion.Instance.Con.Close();
                return m;
            }
            catch (Exception e)
            {
                Conexion.Instance.Con.Close();
                Console.WriteLine(e.Message);
                return null;
                throw;
            }
        }

        public List<Medico> obtenerAnestesistas()
        {
            List<Medico> lista = new List<Medico>();


            SqlCommand com = new SqlCommand();
            
            //string str = ;
            
            com.CommandText = "select * from MEDICO WHERE ESPECIALIDAD_MEDICO=@especialidad AND DISPONIBILIDAD_FUNCIONARIO=@disponibilidad";
            com.Parameters.AddWithValue("@especialidad", "Anestesiología y Reanimación");
            com.Parameters.AddWithValue("@disponibilidad", true);
            com.Connection = Conexion.Instance.Con;
            SqlDataReader reader = com.ExecuteReader();
            while (reader.Read())
            {
                Medico m = new Medico();
                m.Run = reader.GetString(0);
                m.EspecialidadMedico = reader.GetString(1);
                m.Nombre = reader.GetString(2);
                m.ApellidoPaterno = reader.GetString(3);
                m.ApellidoMaterno = reader.GetString(4);
                m.FechaNacimiento = reader.GetDateTime(5);
                m.Sexo = reader.GetString(6)[0];
                m.Disponible = reader.GetBoolean(7);

                lista.Add(m);
            }

            Conexion.Instance.Con.Close();
            
            return lista;
        }

        public ComboBox.ObjectCollection obtenerEspecialidadesMedicas()
        {
            ComboBox.ObjectCollection lista = new ComboBox.ObjectCollection(new ComboBox());

            //SqlConnection con = new SqlConnection(connectionString);
            SqlCommand com = new SqlCommand();
            
            string str = "select * from ESPECIALIDADMEDICA";
            com.CommandText = str;
            com.Connection = Conexion.Instance.Con;
            SqlDataReader reader = com.ExecuteReader();
            while (reader.Read())
            {
                lista.Add(((string)reader["Nombre"]).Trim());
            }

            reader.Close();
            Conexion.Instance.Con.Close();
            return lista;
        }

    }
}
